import { IDragProps } from './drag'

/**
 * 过滤掉对象内部不需要的属性
 * @param obj 源对象
 * @param attrs 需要过滤的属性列表
 * @returns 
 */
export function filterObject(obj: Record<string, any>, attrs: Array<string>) {
    attrs.forEach(key => {
        Reflect.deleteProperty(obj, key)
    })
    return obj
}
/**
 * 保存对象内部需要的属性
 * @param obj 源对象
 * @param attrs 需要保存的属性列表
 * @returns 
 */
export function saveObject(obj: Record<string, any>, attrs: Array<string>) {
    const res: Record<string, any> = {};
    attrs.forEach(key => {
        if (obj[key]) Reflect.set(res, key, obj[key])
    })
    return res;
}

/** 深度克隆元素 */
export function deepCloneValue(value: any) {
    if (typeof value !== 'object') return value;
    if (value instanceof Array) return [...value];
    return { ...value }
}

/**
 * 移除容器内的第i个节点
 * @param parentNode 容器
 * @param index 索引
 */
export function removeNode(parentNode: HTMLElement, index: number): void {
    parentNode.children[index].remove()
}

/**
 * 将一个新节点插入到容器的第i个位置
 * @param parentNode 容器
 * @param index 索引
 * @param node 新节点
 */
export function insertNode(parentNode: HTMLElement, index: number, node: HTMLElement): void {
    parentNode.insertBefore(node, parentNode.children[index])
}

/**
 * 将源数组第i个位置的元素去掉并插入到第j个位置
 * @param arr 源数组
 * @param oldIndex 旧索引
 * @param newIndex 新索引
 */
export function insertSortArray<T>(arr: Array<T>, oldIndex: number, newIndex: number): Array<T> {
    const _arr = [...arr];
    const deepArrItem = deepCloneValue(_arr[oldIndex]);
    _arr.splice(oldIndex, 1);
    _arr.splice(newIndex, 0, deepArrItem);
    return _arr;
}

/** 检测新对象的哪些字段发生变化 */
export function diffObject(oldParams: Partial<IDragProps>, newParams: Partial<IDragProps>): Partial<IDragProps> {
    const newOption: Partial<IDragProps> = {}
    Object.keys(newParams).forEach(key => {
        let newVal = Reflect.get(newParams, key), oldVal = Reflect.get(oldParams, key);
        if (typeof newVal === 'object') newVal = JSON.stringify(newVal);
        if (typeof oldVal === 'object') oldVal = JSON.stringify(oldVal);
        if (oldVal !== newVal) {
            Reflect.set(newOption, key, newVal)
        }
    })
    return newOption
}

